﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Cesave.Domain.PermisosModule.Entities;
using System.ComponentModel;
using Cesave.Domain.PermisosModule.Contracts.Cultivos;
using Cesave.Infrastructure.CrossCutting.IoC;
using System.Windows.Forms;

namespace Cesave.DistributedServices.PermisosModule.WindowsHost.ViewModels.Catalogs.VariedadesGrupos
{
    /// <summary>
    /// Sección de manejo de cultivos.
    /// </summary>
    public partial class VariedadesGruposViewModel
    {
        #region Private properties

        /// <summary>
        /// Lista de cultivos.
        /// </summary>
        private List<Cultivo> _cultivos;

        /// <summary>
        /// Cultivo seleccionado en la vista.
        /// </summary>
        private Cultivo _cultivo;

        #endregion

        #region Public properties

        /// <summary>
        /// Lista de cultivos.
        /// </summary>
        public List<Cultivo> Cultivos
        {
            get
            {
                return _cultivos;
            }
            private set
            {
                _cultivos = value;
                if (_cultivos != null)
                    RaisePropertyChanged("Cultivos");
            }
        }

        /// <summary>
        /// Cultivo seleccionado en la vista.
        /// </summary>
        public Cultivo Cultivo
        {
            get
            {
                return _cultivo;
            }
            private set
            {
                _cultivo = value;
                if (_cultivo != null)
                    RaisePropertyChanged("Cultivo");
            }
        }

        #endregion

        #region Private methods

        /// <summary>
        /// Carga los cultivos.
        /// </summary>
        private void LoadCultivos()
        {
            StartWaiting();
            using (BackgroundWorker worker = new BackgroundWorker())
            {
                worker.DoWork += (sender, e) =>
                {
                    ICultivoService service = IoCFactory.Resolve<ICultivoService>();
                    e.Result = service.FindAllCultivos();
                };
                worker.RunWorkerCompleted += (sender, e) =>
                {
                    EndWaiting();
                    if (!e.Cancelled && e.Error == null)
                        Cultivos = e.Result as List<Cultivo>;
                    else if (e.Error != null)
                        ShowMessage(e.Error.Message);
                };
                worker.WorkerSupportsCancellation = true;
                worker.RunWorkerAsync();
            }
        }

        #endregion

        #region Event methods

        /// <summary>
        /// Identifica el cultivo actualmente seleccionado en la vista.
        /// </summary>
        private void SetCurrentCultivo(object sender, EventArgs e)
        {
            BindingSource bindingSource = sender as BindingSource;
            if (bindingSource != null && bindingSource.Current != null)
                Cultivo = bindingSource.Current as Cultivo;
        }

        /// <summary>
        /// Se ejecuta al momento que la propiedad Cultivos cambia de valor.
        /// </summary>
        private void OnCultivosPropertyChanged()
        {
            _view.cultivosBindingSource.DataSource = Cultivos;
            _view.cultivosBindingSource.CurrentChanged += SetCurrentCultivo;
            SetCurrentCultivo(_view.cultivosBindingSource, new EventArgs());
        }

        /// <summary>
        /// Se ejecuta al momento que la propiedad Cultivo cambia de valor.
        /// </summary>
        private void OnCultivoPropertyChanged()
        {
			LoadGrupos();
        }

        #endregion

    }
}
